package com.wan.data.mysql.orm.repository;

import com.wan.data.mysql.orm.entity.Entity;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public interface Repository<PK extends Serializable,E> {

    Map<Class<? extends Entity<?>>,Repository<?,? extends Entity<?>>> REPOSITORY_MAP = new HashMap<>();

    static <PK extends Serializable,E extends Entity<PK>> Repository<PK,E> getRepository(Class<E> cls){
        //noinspection unchecked
        return (Repository<PK, E>) REPOSITORY_MAP.get(cls);
    }

    /**
     * 获取单个实体
     */
    E get(PK pk);

    /**
     * 根据多个主键获取多个实体
     */
    default Collection<E> get(PK...pks){
        return get(Arrays.asList(pks));
    }
    Collection<E> get(Collection<PK> pks);

    /**
     * 获取全部
     */
    Map<PK,E> getAll();

    /**
     * 插入一条
     */
    void insert(E e);

    /**
     * 修改
     */
    void update(Collection<E> list);
    default void delete(PK...pks){
        delete(Arrays.asList(pks));
    }

    /**
     * 删除
     */
    void delete(Collection<PK> list);
    default void update(E...e){
        update(Arrays.asList(e));
    }

    /**
     * 替换
     */
    default void replaceInto(E...e){
        replaceInto(Arrays.asList(e));
    }
    void replaceInto(Collection<E> list);

    /**
     * 保存
     * 自动识别是插入还是修改
     */
    default void save(E...entities){
        save(Arrays.asList(entities));
    }
    void save(Collection<E> list);
    void save(E e);




}
